package com.kclm.se.file;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/****
 * @author yejf
 * @since JDK8.0
 * @CreateDate 2020年12月31日 下午3:25:51 
 * @description 此类用来描述了文件COPY和文件夹COPY的操作步骤
 *
 */
public class FileCopy {

	/************
	 * 文件COPY
	 * @param src 源文件，只能是文件，不能是目录
	 * @param dest 目标文件，有可能是文件，有可能是目录
	 * @return
	 */
	public static boolean copyFile(String src, String dest) {
		File srcFile = new File(src);
		if(!srcFile.exists()) {
			System.out.printf("源文件[%s]不存在\n", src);
			return false;
		}
		if(srcFile.isDirectory()) {
			System.out.printf("此方法不支持目录的COPY\n");
			return false;
		}
		//
		File destFile = new File(dest);
		if(destFile.isDirectory()) {
			//进一步判断目标目录与源文件所在的目录是否为同一个目录
			if(destFile.equals(srcFile.getParentFile())) {
				//是同一个目录,则在原文件名的基础上，添加 "_副本" 字样
				StringBuilder builder = new StringBuilder();
				builder.append(srcFile.getName().substring(0, srcFile.getName().lastIndexOf(".")))
					.append("_副本")
					.append(srcFile.getName().substring(srcFile.getName().lastIndexOf(".")));
				//
				return copyFile(srcFile, new File(destFile, builder.toString()));
			} else {
				//不是同一个目录
				return copyFile(srcFile, new File(destFile, srcFile.getName()));
			}
		} else {
			return copyFile(srcFile, destFile);
		}
	}
	
	/****
	 * 
	 * @param srcFile 源文件
	 * @param destFile 目标文件，不能是目录
	 * @return
	 */
	private static boolean copyFile(File srcFile, File destFile) {
		byte[] buf = new byte[1024*4*100]; //400k
		int len = -1;
		//
		try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
				BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));) {
			//循环读写
			while((len = bis.read(buf)) != -1) {
				bos.write(buf, 0, len);
			}
			//copy 成功
			return true;
		} catch(IOException e) {
			e.printStackTrace();
		}
		//copy 失败
		return false;
	}
	
	
	/********************
	 * 文件夹的COPY
	 * @param srcDir 源文件夹
	 * @param destDir 目标文件夹
	 * @return
	 */
	public static void copyDir(String srcDir, String destDir) {
		File srcDirFile = new File(srcDir);
		if(srcDirFile.isFile()) {
			System.out.println("此方法是用来COPY文件夹的，如果COPY文件，请调用copyFile方法");
			return ;
		}
		File destDirFile = new File(destDir);
		if(destDirFile.isFile()) {
			System.out.printf("目标不是文件夹：%s\n", destDir);
			return ;
		}
		//
		copyDir(srcDirFile, destDirFile);
	}
	
	/*****
	 * 以 File 为参数进行文件夹的COPY
	 * @param srcDirFile
	 * @param destDirFile
	 * @return
	 */
	private static void copyDir(File srcDirFile, File destDirFile) {
		//创建目标目录结构
		File storeDir = new File(destDirFile, srcDirFile.getName());
		storeDir.mkdirs();
		//把源文件夹下的所有file列出来
		File[] files = srcDirFile.listFiles();
		//遍历
		for(File file : files) {
			//判断
			if(file.isFile()) {
				System.out.println("开始读写文件: "+file.getAbsolutePath());
				//copy文件
				copyFile(file, new File(storeDir, file.getName()));
			} else {
				System.out.println("正在复制对应的目录: "+file.getAbsolutePath());
				//递归调用
				copyDir(file, storeDir);
			}
		}
	}
}


